【问题解决】记录一次EasyExcel2.2.6版本内存泄漏问题 | 您所在的位置:网站首页 › xmlbeans 230 漏洞 › 【问题解决】记录一次EasyExcel2.2.6版本内存泄漏问题 |
【问题解决】记录一次EasyExcel2.2.6版本内存泄漏问题 "目录:" 1.问题现象2.本地调试3.问题修改 1.问题现象 生成Excel文件后,JVM内存一直没有释放 2.本地调试 使用工具:Idea、VisualVM (1)监控占用内存统计信息: 执行前: 执行后: org.apache.xmlbeans.impl.store.Xobj$AttrXobj 131,110,368 B (11.4%) 1,365,733 (6.6%) org.apache.xmlbeans.impl.store.Xobj$ElementXobj 87,829,440 B (7.3%) 914,890 (3.3%) 发现上面两个对象一直不释放,怀疑内存泄漏 (2)导出dump文件 jmap -dump:live,format=b,file=mydump.hprof 22176 (3)使用Mat分析 定位到ExcelWriter中重写了finalize方法,导致在GC队列中,具体参考:https://www.if98.com/1355913552/linux/177318.html 3.问题修改 由于项目一直用的2.2.6版本,如果升级版本到3.1.X(官方移除finalize重写在该版本)影响较大,无法评估工作量,所以使用javaassit工具直接修改class文件移除ExcelWriter和ExcelReader中的finalize方法。 org.javassist javassist 3.27.0-GA public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException { ClassPool pool = ClassPool.getDefault(); pool.insertClassPath("D:\\env\\repository-nexus\\com\\alibaba\\easyexcel\\2.2.6\\easyexcel-2.2.6.jar"); CtClass ctClass = pool.get("com.alibaba.excel.ExcelWriter"); CtMethod ctm = ctClass.getDeclaredMethod("finalize"); ctClass.removeMethod(ctm); CtClass ctClass1 = pool.get("com.alibaba.excel.ExcelReader"); CtMethod ctm1 = ctClass1.getDeclaredMethod("finalize"); ctClass1.removeMethod(ctm1); ctClass.writeFile("D:\\env\\repository-nexus\\com\\fp\\javassis"); ctClass1.writeFile("D:\\env\\repository-nexus\\com\\fp\\javassis"); } 上传到公司私服,exclude com.alibaba.easyexcel,引入新的包 com.fengpin fp-core-base com.alibaba easyexcel com.fp.easyexcel easyexcel 2.2.6问题解决 ……………… |
CopyRight 2018-2019 实验室设备网 版权所有 |